package com.leontg77.uhc;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.Entity;
import org.bukkit.entity.ExperienceOrb;
import org.bukkit.entity.Item;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.entity.TNTPrimed;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.event.entity.PotionSplashEvent;
import org.bukkit.event.inventory.CraftItemEvent;
import org.bukkit.event.player.PlayerItemConsumeEvent;
import org.bukkit.event.player.PlayerPortalEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.potion.Potion;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.potion.PotionType;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.util.Vector;
import com.leontg77.uhc.utils.DateUtils;
import com.leontg77.uhc.utils.NameUtils;
import com.leontg77.uhc.utils.NumberUtils;
import com.leontg77.uhc.utils.PlayerUtils;
/**
* The spectator class to manage spectating.
* <p>
* This class contains methods for enabling/disabling spec mode, toggling spec mode and managing vanishing.
*
* @author LeonTG77
*/
public class Spectator {
private static Spectator manager = new Spectator();
public HashSet<String> spectators = new HashSet<String>();
public HashSet<String> specinfo = new HashSet<String>();
public HashSet<String> cmdspy = new HashSet<String>();
/**
* Gets the instance of the class.
*
* @return The instance.
*/
public static Spectator getInstance() {
return manager;
}
/**
* Enable spectator mode for the given player.
*
* @param player the player enabling for.
* @param force force the enabling.
*/
public void enableSpecmode(Player player, boolean force) {
if (force) {
player.sendMessage(Main.PREFIX + "You are now in spectator mode, do not spoil.");
} else {
if (isSpectating(player)) {
player.sendMessage(Main.PREFIX + "Your spectator mode is already enabled.");
return;
}
player.sendMessage(Main.PREFIX + "You are now in spectator mode, do not spoil.");
}
ItemStack compass = new ItemStack (Material.COMPASS);
ItemMeta compassMeta = compass.getItemMeta();
compassMeta.setDisplayName(ChatColor.GREEN + "Teleporter");
compassMeta.setLore(Arrays.asList(ChatColor.GRAY + "Left click to teleport to a random player.", ChatColor.GRAY + "Right click to open a player teleporter."));
compass.setItemMeta(compassMeta);
ItemStack vision = new ItemStack (Material.INK_SACK, 1, (short) 12);
ItemMeta visionMeta = vision.getItemMeta();
visionMeta.setDisplayName(ChatColor.GREEN + "Toggle Night Vision");
visionMeta.setLore(Arrays.asList(ChatColor.GRAY + "Click to toggle the night vision effect."));
vision.setItemMeta(visionMeta);
ItemStack nether = new ItemStack (Material.LAVA_BUCKET, 1);
ItemMeta netherMeta = nether.getItemMeta();
netherMeta.setDisplayName(ChatColor.GREEN + "Players in the nether");
netherMeta.setLore(Arrays.asList(ChatColor.GRAY + "Click to get a list of players in the nether."));
nether.setItemMeta(netherMeta);
ItemStack tp = new ItemStack (Material.FEATHER);
ItemMeta tpMeta = tp.getItemMeta();
tpMeta.setDisplayName(ChatColor.GREEN + "Teleport to 0,0");
tpMeta.setLore(Arrays.asList(ChatColor.GRAY + "Click to teleport to 0,0."));
tp.setItemMeta(tpMeta);
player.getInventory().remove(compass);
player.getInventory().remove(vision);
player.getInventory().remove(nether);
player.getInventory().remove(tp);
for (ItemStack content : player.getInventory().getContents()) {
if (content != null) {
Item item = player.getWorld().dropItem(player.getLocation().getBlock().getLocation().add(0.5, 0.7, 0.5), content);
item.setVelocity(new Vector(0, 0.2, 0));
}
}
for (ItemStack armorContent : player.getInventory().getArmorContents()) {
if (armorContent != null && armorContent.getType() != Material.AIR) {
Item item = player.getWorld().dropItem(player.getLocation().getBlock().getLocation().add(0.5, 0.7, 0.5), armorContent);
item.setVelocity(new Vector(0, 0.2, 0));
}
}
if (player.getTotalExperience() > 0) {
ExperienceOrb exp = player.getWorld().spawn(player.getLocation().getBlock().getLocation().add(0.5, 0.7, 0.5), ExperienceOrb.class);
exp.setExperience(player.getTotalExperience());
exp.setVelocity(new Vector(0, 0.2, 0));
}
player.getInventory().setArmorContents(null);
player.getInventory().clear();
player.setGameMode(GameMode.SPECTATOR);
player.setWalkSpeed(0.2f);
player.setFlySpeed(0.1f);
Teams.getInstance().joinTeam("spec", player);
if (!spectators.contains(player.getName())) {
spectators.add(player.getName());
}
player.getInventory().setItem(1, tp);
player.getInventory().setItem(3, compass);
player.getInventory().setItem(5, nether);
player.getInventory().setItem(7, vision);
for (Player online : PlayerUtils.getPlayers()) {
if (isSpectating(online)) {
online.showPlayer(player);
} else {
online.hidePlayer(player);
}
player.showPlayer(online);
}
}
/**
* Disable spectator mode for the given player.
*
* @param player the player disabling for.
* @param force force the disabling.
*/
public void disableSpecmode(Player player, boolean force) {
if (force) {
player.sendMessage(Main.PREFIX + "You are no longer in spectator mode.");
} else {
if (!isSpectating(player)) {
player.sendMessage(Main.PREFIX + "Your spectator mode is not enabled.");
return;
}
player.sendMessage(Main.PREFIX + "You are no longer in spectator mode.");
player.teleport(Main.getSpawn());
}
player.setGameMode(GameMode.SURVIVAL);
player.setWalkSpeed(0.2f);
player.setFlySpeed(0.1f);
Teams.getInstance().leaveTeam(player);
if (spectators.contains(player.getName())) {
spectators.remove(player.getName());
}
player.removePotionEffect(PotionEffectType.NIGHT_VISION);
player.getInventory().setArmorContents(null);
player.getInventory().clear();
for (Player online : PlayerUtils.getPlayers()) {
if (isSpectating(online)) {
player.hidePlayer(online);
} else {
player.showPlayer(online);
}
online.showPlayer(player);
}
}
/**
* Toggles the given player's spectator mode.
*
* @param player the player toggling for.
*/
public void toggle(Player player, boolean force) {
if (isSpectating(player)) {
enableSpecmode(player, force);
}
else {
disableSpecmode(player, force);
}
}
/**
* Check whether the given player is spectating or not.
*
* @param player the player cheking.
* @return <code>true</code> if the player is speccing, <code>false</code> otherwise.
*/
public boolean isSpectating(Player player) {
return spectators.contains(player.getName());
}
/**
* Check whether the given string is in the spectator list.
*
* @param entry the string cheking.
* @return <code>true</code> if the string is in the spectator list, <code>false</code> otherwise.
*/
public boolean isSpectating(String entry) {
if (entry.equals("CONSOLE")) {
return true;
}
return spectators.contains(entry);
}
/**
* Hides all the spectators for the given player.
*
* @param player the player.
*/
public void hideSpectators(Player player) {
for (Player online : PlayerUtils.getPlayers()) {
if (isSpectating(online)) {
player.hidePlayer(online);
} else {
player.showPlayer(online);
}
online.showPlayer(player);
}
}
/**
* Check whether the given player has specinfo or not.
*
* @param player the player cheking.
* @return <code>true</code> if the player has specinfo, <code>false</code> otherwise.
*/
public boolean hasSpecInfo(Player player) {
if (!spectators.contains(player.getName())) {
return false;
}
if (specinfo.contains(player.getName())) {
return false;
}
return true;
}
/**
* Check whether the given player has cmdspy or not.
*
* @param player the player cheking.
* @return <code>true</code> if the player has cmdspy, <code>false</code> otherwise.
*/
public boolean hasCommandSpy(Player player) {
if (cmdspy.contains(player.getName())) {
return false;
}
return true;
}
/**
* SpecInfo class for all the specinfo broadcasting.
* <p>
* Contains EventHandlers and Listeners for all info SpecInfo needs.
*
* @author LeonTG77
*/
public static class SpecInfo implements Listener {
public static HashMap<String, Integer> totalDiamonds = new HashMap<String, Integer>();
public static HashMap<String, Integer> totalGold = new HashMap<String, Integer>();
public static HashSet<Location> locs = new HashSet<Location>();
public static String prefix() {
return "�8[�9S�8] ";
}
@EventHandler
public void onBlockBreak(BlockBreakEvent event) {
Block block = event.getBlock();
if (block.getType() == Material.GOLD_ORE) {
if (locs.contains(block.getLocation())) {
return;
}
Location loc = block.getLocation();
Player player = event.getPlayer();
int amount = 0;
for (int x = loc.getBlockX() - 2; x <= loc.getBlockX() + 2; x++) {
for (int y = loc.getBlockY() - 2; y <= loc.getBlockY() + 2; y++) {
for (int z = loc.getBlockZ() - 2; z <= loc.getBlockZ() + 2; z++) {
if (loc.getWorld().getBlockAt(x, y, z).getType() == Material.GOLD_ORE) {
locs.add(loc.getWorld().getBlockAt(x, y, z).getLocation());
amount++;
}
}
}
}
if (totalGold.containsKey(player.getName())) {
totalGold.put(player.getName(), totalGold.get(player.getName()) + amount);
} else {
totalGold.put(player.getName(), amount);
}
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�7" + player.getName() + "�f:�6GOLD �f[V:�6" + amount + "�f] [T:�6" + totalGold.get(player.getName()) + "�f]");
}
}
return;
}
if (block.getType() == Material.DIAMOND_ORE) {
if (locs.contains(block.getLocation())) {
return;
}
Location loc = block.getLocation();
Player player = event.getPlayer();
int amount = 0;
for (int x = loc.getBlockX() - 2; x <= loc.getBlockX() + 2; x++) {
for (int y = loc.getBlockY() - 2; y <= loc.getBlockY() + 2; y++) {
for (int z = loc.getBlockZ() - 2; z <= loc.getBlockZ() + 2; z++) {
if (loc.getWorld().getBlockAt(x, y, z).getType() == Material.DIAMOND_ORE) {
locs.add(loc.getWorld().getBlockAt(x, y, z).getLocation());
amount++;
}
}
}
}
if (totalDiamonds.containsKey(player.getName())) {
totalDiamonds.put(player.getName(), totalDiamonds.get(player.getName()) + amount);
} else {
totalDiamonds.put(player.getName(), amount);
}
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�7" + player.getName() + "�f:�3DIAMOND �f[V:�3" + amount + "�f] [T:�3" + totalDiamonds.get(player.getName()) + "�f]");
}
}
}
}
@EventHandler
public void onBlockPlace(BlockPlaceEvent event) {
Block block = event.getBlockPlaced();
if (block.getType() == Material.GOLD_ORE) {
locs.add(block.getLocation());
return;
}
if (block.getType() == Material.DIAMOND_ORE) {
locs.add(block.getLocation());
}
}
@EventHandler
public void onPlayerTeleport(PlayerTeleportEvent event) {
if (event.getCause() == TeleportCause.ENDER_PEARL) {
Player player = event.getPlayer();
if (Spectator.getInstance().isSpectating(player)) {
return;
}
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�5Pearl: �a" + player.getName() + " �f<-> D:�d" + NumberUtils.convertDouble(event.getFrom().distance(event.getTo())) + "m.");
}
}
}
}
@EventHandler
public void onPlayerPortal(PlayerPortalEvent event) {
Player player = event.getPlayer();
if (Spectator.getInstance().isSpectating(player)) {
return;
}
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�dPortal:�6" + player.getName() + "�f from �a" + NameUtils.fixString(event.getFrom().getWorld().getEnvironment().name(), true).replaceAll("Normal", "overworld").toLowerCase() + "�f to �c" + NameUtils.fixString(event.getTo().getWorld().getEnvironment().name(), true).replaceAll("Normal", "overworld").toLowerCase());
}
}
}
@EventHandler
public void onPlayerItemConsume(PlayerItemConsumeEvent event) {
Player player = event.getPlayer();
ItemStack item = event.getItem();
if (Spectator.getInstance().isSpectating(player)) {
return;
}
if (event.getItem().getType() == Material.GOLDEN_APPLE) {
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�aHeal: �6" + player.getName() + "�f<->�6" + (item.hasItemMeta() && item.getItemMeta().hasDisplayName() && item.getItemMeta().getDisplayName().equalsIgnoreCase("�6Golden Head") ? "�5Golden Head" : "Golden Apple"));
}
}
return;
}
if (event.getItem().getType() == Material.POTION) {
Potion pot;
if (item.getDurability() == 8261) {
pot = new Potion(PotionType.INSTANT_HEAL, 1);
} else if (item.getDurability() == 16453) {
pot = new Potion(PotionType.INSTANT_HEAL, 1);
} else {
try {
pot = Potion.fromItemStack(item);
} catch (Exception e) {
return;
}
}
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
for (PotionEffect e : pot.getEffects()) {
online.sendMessage(prefix() + "�5Potion: �a" + player.getName() + "�f <-> P:�d" + NameUtils.getPotionName(e.getType()) + " �fT:�d" + pot.getLevel() + ((e.getDuration() / 20) > 0 ? " �fD:�d" + DateUtils.ticksToString(e.getDuration() / 20) : "") + " �fV:�dNormal");
}
}
}
}
}
@EventHandler
public void onPotionSplash(PotionSplashEvent event) {
if (event.getPotion().getShooter() instanceof Player) {
Player player = (Player) event.getPotion().getShooter();
ItemStack item = event.getPotion().getItem();
Potion pot;
if (item.getDurability() == 16453) {
pot = new Potion(PotionType.INSTANT_HEAL, 1);
} else if (item.getDurability() == 16421) {
pot = new Potion(PotionType.INSTANT_HEAL, 2);
} else {
try {
pot = Potion.fromItemStack(item);
} catch (Exception e) {
return;
}
}
if (Spectator.getInstance().isSpectating(player.getName())) {
return;
}
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
for (PotionEffect e : pot.getEffects()) {
online.sendMessage(prefix() + "�5Potion: �a" + player.getName() + "�f <-> P:�d" + NameUtils.getPotionName(e.getType()) + " �fT:�d" + pot.getLevel() + ((e.getDuration() / 20) > 0 ? " �fD:�d" + DateUtils.ticksToString(e.getDuration() / 20) : "") + " �fV:�dSplash");
}
}
}
}
}
@EventHandler
public void onCraftItem(CraftItemEvent event) {
Player player = (Player) event.getWhoClicked();
ItemStack item = event.getRecipe().getResult();
if (Spectator.getInstance().isSpectating(player.getName())) {
return;
}
if (item.getType() == Material.GOLDEN_APPLE) {
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�2Craft�f: �a" + player.getName() + "�f<->�6" + (item.hasItemMeta() && item.getItemMeta().hasDisplayName() && item.getItemMeta().getDisplayName().equalsIgnoreCase("�6Golden Head") ? "�5Golden Head" : "Golden Apple"));
}
}
return;
}
if (item.getType() == Material.DIAMOND_HELMET) {
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�2Craft�f: �a" + player.getName() + "�f<->�bDia. Helmet");
}
}
return;
}
if (item.getType() == Material.DIAMOND_CHESTPLATE) {
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�2Craft�f: �a" + player.getName() + "�f<->�bDia. Chest");
}
}
return;
}
if (item.getType() == Material.DIAMOND_LEGGINGS) {
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�2Craft�f: �a" + player.getName() + "�f<->�bDia. Leggings");
}
}
return;
}
if (item.getType() == Material.DIAMOND_BOOTS) {
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�2Craft�f: �a" + player.getName() + "�f<->�bDia. Boots");
}
}
return;
}
if (item.getType() == Material.DIAMOND_SWORD) {
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�2Craft�f: �a" + player.getName() + "�f<->�bDia. Sword");
}
}
return;
}
if (item.getType() == Material.BOW) {
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�2Craft�f: �a" + player.getName() + "�f<->�dBow");
}
}
return;
}
if (item.getType() == Material.ANVIL) {
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�2Craft�f: �a" + player.getName() + "�f<->�dAnvil");
}
}
return;
}
if (item.getType() == Material.ENCHANTMENT_TABLE) {
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�2Craft�f: �a" + player.getName() + "�f<->�dEnchant. Table");
}
}
return;
}
if (item.getType() == Material.BREWING_STAND_ITEM) {
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�2Craft�f: �a" + player.getName() + "�f<->�dBrewing Stand");
}
}
}
}
@EventHandler(ignoreCancelled = true)
public void onDamage(final EntityDamageEvent event) {
if (event.isCancelled()) {
return;
}
if (!(event.getEntity() instanceof Player)) {
return;
}
final Player player = (Player) event.getEntity();
if (Spectator.getInstance().isSpectating(player.getName())) {
return;
}
if (event instanceof EntityDamageByEntityEvent) {
onDamageByOther(player, (EntityDamageByEntityEvent) event);
return;
}
final DamageCause cause = event.getCause();
final double olddamage = player.getHealth();
new BukkitRunnable() {
public void run() {
double damage = olddamage - player.getHealth();
if (damage <= 0) {
return;
}
if (cause == DamageCause.LAVA) {
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�5PvE�f:�c" + player.getName() + "�f<-�dLava �f[�c" + NumberUtils.convertDouble((player.getHealth() / 2)) + "�f] [�6" + NumberUtils.convertDouble((damage / 2)) + "�f]");
}
}
return;
}
else if (cause == DamageCause.FIRE || cause == DamageCause.FIRE_TICK) {
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�5PvE�f:�c" + player.getName() + "�f<-�dFire �f[�c" + NumberUtils.convertDouble((player.getHealth() / 2)) + "�f] [�6" + NumberUtils.convertDouble((damage / 2)) + "�f]");
}
}
return;
}
else if (cause == DamageCause.CONTACT) {
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�5PvE�f:�c" + player.getName() + "�f<-�dCactus �f[�c" + NumberUtils.convertDouble((player.getHealth() / 2)) + "�f] [�6" + NumberUtils.convertDouble((damage / 2)) + "�f]");
}
}
return;
}
else if (cause == DamageCause.DROWNING) {
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�5PvE�f:�c" + player.getName() + "�f<-�dDrowning �f[�c" + NumberUtils.convertDouble((player.getHealth() / 2)) + "�f] [�6" + NumberUtils.convertDouble((damage / 2)) + "�f]");
}
}
return;
}
else if (cause == DamageCause.FALL) {
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�5PvE�f:�c" + player.getName() + "�f<-�dFall �f[�c" + NumberUtils.convertDouble((player.getHealth() / 2)) + "�f] [�6" + NumberUtils.convertDouble((damage / 2)) + "�f]");
}
}
return;
}
else if (cause == DamageCause.LIGHTNING) {
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�5PvE�f:�c" + player.getName() + "�f<-�dLightning �f[�c" + NumberUtils.convertDouble((player.getHealth() / 2)) + "�f] [�6" + NumberUtils.convertDouble((damage / 2)) + "�f]");
}
}
return;
}
else if (cause == DamageCause.MAGIC) {
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�5PvE�f:�c" + player.getName() + "�f<-�dMagic �f[�c" + NumberUtils.convertDouble((player.getHealth() / 2)) + "�f] [�6" + NumberUtils.convertDouble((damage / 2)) + "�f]");
}
}
return;
}
else if (cause == DamageCause.POISON) {
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�5PvE�f:�c" + player.getName() + "�f<-�dPoison �f[�c" + NumberUtils.convertDouble((player.getHealth() / 2)) + "�f] [�6" + NumberUtils.convertDouble((damage / 2)) + "�f]");
}
}
return;
}
else if (cause == DamageCause.STARVATION) {
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�5PvE�f:�c" + player.getName() + "�f<-�dStarving �f[�c" + NumberUtils.convertDouble((player.getHealth() / 2)) + "�f] [�6" + NumberUtils.convertDouble((damage / 2)) + "�f]");
}
}
return;
}
else if (cause == DamageCause.SUFFOCATION) {
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�5PvE�f:�c" + player.getName() + "�f<-�dSuffocation �f[�c" + NumberUtils.convertDouble((player.getHealth() / 2)) + "�f] [�6" + NumberUtils.convertDouble((damage / 2)) + "�f]");
}
}
return;
}
else if (cause == DamageCause.VOID) {
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�5PvE�f:�c" + player.getName() + "�f<-�dVoid �f[�c" + NumberUtils.convertDouble((player.getHealth() / 2)) + "�f] [�6" + NumberUtils.convertDouble((damage / 2)) + "�f]");
}
}
}
else if (cause == DamageCause.WITHER) {
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�5PvE�f:�c" + player.getName() + "�f<-�dWither �f[�c" + NumberUtils.convertDouble((player.getHealth() / 2)) + "�f] [�6" + NumberUtils.convertDouble((damage / 2)) + "�f]");
}
}
return;
}
else if (cause == DamageCause.BLOCK_EXPLOSION) {
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�5PvE�f:�c" + player.getName() + "�f<-�dTNT �f[�c" + NumberUtils.convertDouble((player.getHealth() / 2)) + "�f] [�6" + NumberUtils.convertDouble((damage / 2)) + "�f]");
}
}
return;
}
else {
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�5PvE�f:�c" + player.getName() + "�f<-�d??? �f[�c" + NumberUtils.convertDouble((player.getHealth() / 2)) + "�f] [�6" + NumberUtils.convertDouble((damage / 2)) + "�f]");
}
}
}
}
}.runTaskLater(Main.plugin, 1);
}
private void onDamageByOther(final Player player, final EntityDamageByEntityEvent event) {
if (Spectator.getInstance().isSpectating(player.getName())) {
return;
}
final double olddamage = player.getHealth();
new BukkitRunnable() {
public void run() {
double damage = olddamage - player.getHealth();
if (damage <= 0) {
return;
}
if (event.getDamager() instanceof Player) {
Player killer = (Player) event.getDamager();
if (Spectator.getInstance().isSpectating(killer)) {
return;
}
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�4PvP�f:�a" + killer.getName() + "�f-M>�c" + player.getName() + " �f[�a" + NumberUtils.convertDouble((killer.getHealth() / 2)) + "�f:�c" + NumberUtils.convertDouble((player.getHealth() / 2)) + "�f] [�6" + NumberUtils.convertDouble((damage / 2)) + "�f]");
}
}
return;
}
else if (event.getDamager() instanceof Projectile) {
Projectile p = (Projectile) event.getDamager();
if (p.getShooter() instanceof Player) {
Player shooter = (Player) p.getShooter();
if (p instanceof Arrow) {
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�4PvP�f:�a" + shooter.getName() + "�f-B>�c" + player.getName() + " �f[�a" + NumberUtils.convertDouble((shooter.getHealth() / 2)) + "�f:�c" + NumberUtils.convertDouble((player.getHealth() / 2)) + "�f] [�6" + NumberUtils.convertDouble((damage / 2)) + "�f]");
}
}
return;
}
else {
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�4PvP�f:�a" + shooter.getName() + "�f-?P>�c" + player.getName() + " �f[�a" + NumberUtils.convertDouble((shooter.getHealth() / 2)) + "�f:�c" + NumberUtils.convertDouble((player.getHealth() / 2)) + "�f] [�6" + NumberUtils.convertDouble((damage / 2)) + "�f]");
}
}
}
return;
}
else {
if (p.getShooter() instanceof Entity) {
Entity entity = (Entity) p.getShooter();
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�5PvE�f:�c" + player.getName() + "�f<-�d" + NameUtils.getMobName(entity.getType()) + " �f[�c" + NumberUtils.convertDouble((player.getHealth() / 2)) + "�f] [�6" + NumberUtils.convertDouble((damage / 2)) + "�f]");
}
}
return;
}
else {
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�5PvE�f:�c" + player.getName() + "�f<-�d??? �f[�c" + NumberUtils.convertDouble((player.getHealth() / 2)) + "�f] [�6" + NumberUtils.convertDouble((damage / 2)) + "�f]");
}
}
}
}
return;
}
else if (event.getDamager() instanceof LivingEntity) {
Entity e = event.getDamager();
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�5PvE�f:�c" + player.getName() + "�f<-�d" + NameUtils.getMobName(e.getType()) + " �f[�c" + NumberUtils.convertDouble((player.getHealth() / 2)) + "�f] [�6" + NumberUtils.convertDouble((damage / 2)) + "�f]");
}
}
return;
}
else if (event.getDamager() instanceof TNTPrimed) {
Entity e = event.getDamager();
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�5PvE�f:�c" + player.getName() + "�f<-�d" + NameUtils.getMobName(e.getType()) + " �f[�c" + NumberUtils.convertDouble((player.getHealth() / 2)) + "�f] [�6" + NumberUtils.convertDouble((damage / 2)) + "�f]");
}
}
return;
}
else {
for (Player online : PlayerUtils.getPlayers()) {
if (Spectator.getInstance().hasSpecInfo(online)) {
online.sendMessage(prefix() + "�5PvE�f:�c" + player.getName() + "�f<-�d??? �f[�c" + NumberUtils.convertDouble((player.getHealth() / 2)) + "�f] [�6" + NumberUtils.convertDouble((damage / 2)) + "�f]");
}
}
}
}
}.runTaskLater(Main.plugin, 1);
}
}
}